package com.example.scala.chapter3
import scala.collection.immutable

/**
 *
 * Description:
 *
 * Create by lucienoz on 2021/10/15.
 * Copyright © 2021 lucienoz. All rights reserved.
 */
object chapter08 {
	def main(args : Array[String]) : Unit = {
		println("=="*20)
		for (i <- Range(1,5)){ //不包含5,使用Range类建立的对象，直接创建的对象不包含尾值"[)"
			println(i)
		}

		println("=="*20)
		for (i <- 1 to 5) println(i) //包含5,Int对象使用隐式转换RichInt调用to方法调用Range.inclusive(self, end)方法，产生Range.Inclusive对象，Inclusive对象时Range的内部类和子类，但在可以拿到其迭代器的尾值
		println("=="*20)
		for (i <- 1 until  5) println(i) //不包含5，Int对象使用隐式转换RichInt调用until方法调用Range(self, end)方法，产生Range对象，拿不到其迭代器的尾值
		println("=="*20)
		for (i <- 1 to 5 if i == 2) println(i) //使用循环守卫进行条件判断满足条件的进入循环体,后面的if为Scala解释器关联字调用方法为scala.collection.TraversableLike.withFilter，此方法不可再此调用Scala编译器存在其他操作
		println("=="*20)
		for (i <- 1 to 5 by 1) println(i) //使用循环步长，后面的by为调用Range的by方法传入步长参数生成一个步长不是1的Range对象，注直接调用Range(start,end)创建的Range对象步长为1，具体实现在其伴生对象中apply方法定义：def apply(start: Int, end: Int): Range = new Range(start, end, 1)
		println("=="*20)

		for (i <- 1 to 5 by 2 if i == 3;foo = "foo" ;  bar = "bar" ){ //循环变量引入，通过";"分割引入多个变量
			print(i+"\t")
			print(foo+"\t")
			print(bar+"\n")
		}
		println("=="*20)
		for (i <- 1 to 5 ;j <- 1 to 3 ;foo = "bar"){ //循环嵌套,多个循环嵌套可用";"进行分割,同样变量和循环体均可通过";"进行声明调用
			println(s"i = $i \t j = $j \t foo = $foo")
		}
		//1 - 1//        *
		//2 - 3//       ***
		//3 - 5//      *****
		//4 - 7//     *******
		println("=="*20)

		val indexedSeq : immutable.Seq[(Int, Int, String)] = for (i <- 1 to 5; j <- 1 to 3; foo = "bar") yield { //循环返回值,通过yield关键字将数据整合到一个可迭代seq对象里
			println ( s"i = $i \t j = $j \t foo = $foo" )
			(i, j, foo)
		}

		println(indexedSeq) //Vector((1,1,bar), (1,2,bar), (1,3,bar), (2,1,bar), (2,2,bar), (2,3,bar), (3,1,bar), (3,2,bar), (3,3,bar), (4,1,bar), (4,2,bar), (4,3,bar), (5,1,bar), (5,2,bar), (5,3,bar))

		println("=="*20)
		for (elem <- List ( ("a", 1), ("b", 3) ) if elem._1 == "a") {
			println(elem)
		}

		println("=="*20)


		println("=="*20)
		println("=="*20)
		println("=="*20)

	}

}
